Перейти к основному содержимому

Ввод в консоли. Функция scanf

Что такое функция scanf()

Функция scanf() позволяет считывать данные, введенные пользователем с клавиатуры.

scanf(строка_формата, адреса_переменных);
Важно

В scanf() перед именем переменной ставится символ & (амперсанд) — это адрес переменной в памяти.

Базовый ввод данных

Ввод целых чисел

#include <stdio.h>

int main() {
int age;

printf("Введите ваш возраст: ");
scanf("%d", &age); // Считываем целое число

printf("Вам %d лет\n", age);

return 0;
}

Ввод разных типов

#include <stdio.h>

int main() {
int number;

printf("Введите целое число: ");
scanf("%d", &number);

printf("Вы ввели: %d\n", number);
printf("Удвоенное значение: %d\n", number * 2);

return 0;
}

Спецификаторы для scanf()

СпецификаторТип переменнойОписание
%dintЦелое число
%ffloatДробное число
%lfdoubleДробное число двойной точности
%ccharОдин символ
%schar[]Строка (без пробелов)

Ввод нескольких значений

#include <stdio.h>

int main() {
int day, month, year;

printf("Введите дату (день месяц год): ");
scanf("%d %d %d", &day, &month, &year);

printf("Вы ввели дату: %02d.%02d.%d\n", day, month, year);

// Простая проверка
if (month >= 1 && month <= 12 && day >= 1 && day <= 31) {
printf("✅ Дата корректна\n");
} else {
printf("❌ Дата некорректна\n");
}

return 0;
}

Ввод строк

Простой ввод строки

#include <stdio.h>

int main() {
char name[50]; // Резервируем место для имени

printf("Введите ваше имя: ");
scanf("%s", name); // Для строк & не нужен!

printf("Привет, %s!\n", name);

return 0;
}
Ограничение scanf() для строк

scanf("%s") читает только до первого пробела. Строка "Иван Петров" прочитается как "Иван".

Ввод строки с пробелами

#include <stdio.h>

int main() {
char firstName[30];
char lastName[30];

printf("Введите имя: ");
scanf("%s", firstName);

printf("Введите фамилию: ");
scanf("%s", lastName);

printf("Полное имя: %s %s\n", firstName, lastName);

return 0;
}

Ввод: Иван Петров Результат: имя = "Иван", фамилия = "Петров"

Практические примеры

Простой калькулятор

#include <stdio.h>

int main() {
float num1, num2;
char operation;

printf("=== КАЛЬКУЛЯТОР ===\n");
printf("Введите первое число: ");
scanf("%f", &num1);

printf("Введите операцию (+, -, *, /): ");
scanf(" %c", &operation); // Пробел перед %c!

printf("Введите второе число: ");
scanf("%f", &num2);

printf("\n%.2f %c %.2f = ", num1, operation, num2);

switch (operation) {
case '+':
printf("%.2f\n", num1 + num2);
break;
case '-':
printf("%.2f\n", num1 - num2);
break;
case '*':
printf("%.2f\n", num1 * num2);
break;
case '/':
if (num2 != 0) {
printf("%.2f\n", num1 / num2);
} else {
printf("Ошибка: деление на ноль!\n");
}
break;
default:
printf("Неизвестная операция\n");
}

return 0;
}

Обработка массива с вводом

#include <stdio.h>

int main() {
int students = 5;
int grades[5];
int sum = 0;

printf("Введите оценки %d студентов:\n", students);

// Ввод оценок
for (int i = 0; i < students; i++) {
printf("Студент %d: ", i + 1);
scanf("%d", &grades[i]);
sum += grades[i];
}

// Анализ результатов
float average = (float)sum / students;
int passed = 0;

printf("\n=== РЕЗУЛЬТАТЫ ===\n");
for (int i = 0; i < students; i++) {
printf("Студент %d: %d баллов", i + 1, grades[i]);

if (grades[i] >= 70) {
printf(" - Зачет ✅\n");
passed++;
} else {
printf(" - Незачет ❌\n");
}
}

printf("\nСредний балл: %.1f\n", average);
printf("Сдали: %d из %d студентов\n", passed, students);

return 0;
}

Валидация пользовательского ввода

Проверка корректности

#include <stdio.h>

int main() {
int month;
int valid = 0;

while (!valid) {
printf("Введите номер месяца (1-12): ");
scanf("%d", &month);

if (month >= 1 && month <= 12) {
valid = 1;
printf("✅ Корректный месяц: %d\n", month);
} else {
printf("❌ Ошибка! Месяц должен быть от 1 до 12\n");
}
}

return 0;
}

Интерактивные программы

Игра "Угадай число"

#include <stdio.h>

int main() {
int secretNumber = 42; // В реальности используйте случайные числа
int guess;
int attempts = 0;
int maxAttempts = 5;

printf("🎯 ИГРА: Угадайте число от 1 до 100\n");
printf("У вас %d попыток\n\n", maxAttempts);

while (attempts < maxAttempts) {
attempts++;
printf("Попытка %d: ", attempts);
scanf("%d", &guess);

if (guess == secretNumber) {
printf("🎉 Поздравляем! Вы угадали за %d попыток!\n", attempts);
break;
} else if (guess < secretNumber) {
printf("📈 Загаданное число больше\n");
} else {
printf("📉 Загаданное число меньше\n");
}

if (attempts < maxAttempts) {
printf("Осталось попыток: %d\n\n", maxAttempts - attempts);
}
}

if (guess != secretNumber) {
printf("😔 Попытки закончились. Загаданное число: %d\n", secretNumber);
}

return 0;
}

Очистка буфера ввода

Проблема с остатками в буфере

#include <stdio.h>

int main() {
int number;
char letter;

printf("Введите число: ");
scanf("%d", &number);

// Очищаем буфер от символа новой строки
while (getchar() != '\n');

printf("Введите символ: ");
scanf("%c", &letter);

printf("Число: %d, символ: '%c'\n", number, letter);

return 0;
}

Частые ошибки

Распространенные проблемы
// ❌ Забыть амперсанд (&) для переменных
int age;
scanf("%d", age); // Ошибка! Должно быть &age

// ❌ Использовать & для строк
char name[50];
scanf("%s", &name); // Ошибка! Должно быть просто name

// ❌ Неправильный спецификатор
float price;
scanf("%d", &price); // Ошибка! Для float нужен %f

// ❌ Забыть пробел перед %c
int num;
char ch;
scanf("%d", &num);
scanf("%c", &ch); // Прочитает символ новой строки!
// Правильно: scanf(" %c", &ch);

// ❌ Недостаточный размер для строки
char short_name[3];
scanf("%s", short_name); // Ввод "Александр" вызовет переполнение!

Безопасный ввод

Ограничение длины ввода

#include <stdio.h>

int main() {
char username[20];
char password[15];

printf("=== ВХОД В СИСТЕМУ ===\n");

// Ограничиваем ввод размером массива
printf("Логин (до 19 символов): ");
scanf("%19s", username); // Максимум 19 символов + '\0'

printf("Пароль (до 14 символов): ");
scanf("%14s", password); // Максимум 14 символов + '\0'

printf("\nВведенные данные:\n");
printf("Логин: %s\n", username);
printf("Пароль: %s\n", password);

return 0;
}

Проверка успешности ввода

#include <stdio.h>

int main() {
int age;
int result;

printf("Введите ваш возраст: ");
result = scanf("%d", &age);

if (result == 1) {
printf("✅ Успешно прочитано число: %d\n", age);
} else {
printf("❌ Ошибка ввода! Введите число\n");
}

return 0;
}

Интерактивные программы

Анкета пользователя

#include <stdio.h>

int main() {
char name[30];
int age;
char city[30];
float height;

printf("=== АНКЕТА ПОЛЬЗОВАТЕЛЯ ===\n\n");

printf("Как вас зовут? ");
scanf("%29s", name);

printf("Сколько вам лет? ");
scanf("%d", &age);

printf("В каком городе живете? ");
scanf("%29s", city);

printf("Ваш рост (в см)? ");
scanf("%f", &height);

printf("\n=== ВАШИ ДАННЫЕ ===\n");
printf("Имя: %s\n", name);
printf("Возраст: %d лет\n", age);
printf("Город: %s\n", city);
printf("Рост: %.0f см\n", height);

// Простой анализ
if (age >= 18) {
printf("Статус: Совершеннолетний\n");
} else {
printf("Статус: Несовершеннолетний\n");
}

return 0;
}

Обработка списка покупок

#include <stdio.h>

int main() {
int itemCount;
float prices[10]; // Максимум 10 товаров
float total = 0;

printf("=== СПИСОК ПОКУПОК ===\n");
printf("Сколько товаров? (макс. 10): ");
scanf("%d", &itemCount);

if (itemCount > 10) {
itemCount = 10;
printf("Ограничено до 10 товаров\n");
}

printf("\nВводите цены товаров:\n");
for (int i = 0; i < itemCount; i++) {
printf("Товар %d: ", i + 1);
scanf("%f", &prices[i]);
total += prices[i];
}

printf("\n=== ЧЕК ===\n");
for (int i = 0; i < itemCount; i++) {
printf("Товар %d: %.2f руб.\n", i + 1, prices[i]);
}
printf("-----------------\n");
printf("Итого: %.2f руб.\n", total);
printf("НДС (20%%): %.2f руб.\n", total * 0.20);
printf("К доплате: %.2f руб.\n", total * 1.20);

return 0;
}

Ввод данных в массивы

Заполнение массива с клавиатуры

#include <stdio.h>

int main() {
int size = 6;
int temperatures[6];
int sum = 0;

printf("Введите температуру за %d дней:\n", size);

for (int i = 0; i < size; i++) {
printf("День %d: ", i + 1);
scanf("%d", &temperatures[i]);
sum += temperatures[i];
}

// Находим самый теплый и холодный день
int maxTemp = temperatures[0];
int minTemp = temperatures[0];
int maxDay = 1, minDay = 1;

for (int i = 1; i < size; i++) {
if (temperatures[i] > maxTemp) {
maxTemp = temperatures[i];
maxDay = i + 1;
}
if (temperatures[i] < minTemp) {
minTemp = temperatures[i];
minDay = i + 1;
}
}

printf("\n=== АНАЛИЗ ===\n");
printf("Средняя температура: %.1f°C\n", (float)sum / size);
printf("Самый теплый день %d: %d°C\n", maxDay, maxTemp);
printf("Самый холодный день %d: %d°C\n", minDay, minTemp);

return 0;
}

Меню и пользовательский выбор

#include <stdio.h>

int main() {
int choice;
int running = 1;
int balance = 1000;

printf("💳 Добро пожаловать в банкомат!\n");

while (running) {
printf("\n=== ГЛАВНОЕ МЕНЮ ===\n");
printf("1. Проверить баланс\n");
printf("2. Снять деньги\n");
printf("3. Пополнить счет\n");
printf("0. Выход\n");
printf("Ваш выбор: ");

scanf("%d", &choice);

switch (choice) {
case 1:
printf("💰 Ваш баланс: %d руб.\n", balance);
break;

case 2: {
int amount;
printf("Сумма для снятия: ");
scanf("%d", &amount);

if (amount > balance) {
printf("❌ Недостаточно средств\n");
} else if (amount <= 0) {
printf("❌ Сумма должна быть больше 0\n");
} else {
balance -= amount;
printf("✅ Снято %d руб. Остаток: %d руб.\n", amount, balance);
}
break;
}

case 3: {
int amount;
printf("Сумма пополнения: ");
scanf("%d", &amount);

if (amount > 0) {
balance += amount;
printf("✅ Счет пополнен на %d руб. Баланс: %d руб.\n", amount, balance);
} else {
printf("❌ Сумма должна быть больше 0\n");
}
break;
}

case 0:
printf("👋 До свидания!\n");
running = 0;
break;

default:
printf("❌ Неверный выбор\n");
}
}

return 0;
}
Лучшие практики
  • Всегда используйте & перед переменными (кроме строк)
  • Ограничивайте длину ввода строк: scanf("%19s", str)
  • Проверяйте возвращаемое значение scanf() для обработки ошибок
  • Очищайте буфер между вводом разных типов данных
  • Проверяйте границы допустимых значений
Важно помнить
  • scanf() останавливается на пробелах при чтении строк
  • Символ новой строки остается в буфере после ввода числа
  • Для строк с пробелами используйте fgets()
  • Всегда резервируйте достаточно места для строк

Функция scanf() — основной инструмент для создания интерактивных программ, работающих с пользовательским вводом.